/**
 * Copyright (c) 2018-2019 PoleStar Studio. All Rights Reserved. <br>
 * Use is subject to license terms.<br>
 * <p>
 * 在此处填写文件说明
 */
package edu.javaee.spring.zdemo.life;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * bean类.
 * <p>说明.<br>
 *     演示bean生命周期的12个过程，Spring按顺序执行。
 *     1.实例化（构造器、静态工厂、实例工厂）。
 *     2.设置属性值。
 *     3.如果实现BeanNameAware接口，可以获取beanName。
 *     4.如果实现BeanFactoryAware接口，可以获取BeanFactory对象。
 *     5.如果实现ApplicationContextAware接口，可以获取容器对象。
 *     6.如果BeanPostProcessor与Bean关联，则Spring会调用预初始化方法，对容器中的bean进行处理。
 *     7.如果实现了initializingBean接口，则Spring将调用afterPropertiesSet方法。
 *     8.如果在配置文件中指定了定制的初始化方法，则spring会在此时调用。
 *     9.如果BeanPostProcessor与Bean关联，则Spring会调用后初始化方法，对容器中的bean进行处理。
 *     10.如果Bean为单例作用域，则此时Spring将bean放入IoC缓冲区。如果为原型作用域，则将创建好的bean交给调用代码。
 *     11.如果实现了DisposableBean接口，则Spring会调用destory方法。
 *     12.如果在配置文件中指定了定制的销毁方法，则spring会在此时调用。
 * @version v1.0
 * @author lianzuozheng
 * @date 2019-03-24 -13:14 
 */
public class Bean implements BeanNameAware,
        BeanFactoryAware,
        ApplicationContextAware,
        InitializingBean , DisposableBean {

    private String name;

    public void setName(String name) {
        this.name = name;
        System.out.println("2.设置属性值 name="+name);
    }

    /** 无参构造方法  */
    public Bean() {
        System.out.println("1.实例化bean");
    }

    public void initMethod(){
        System.out.println("8. 定制初始化方法");
    }

    public void destoryMethod(){
        System.out.println("12.destory bean");
    }

    @Override
    public void setBeanName(String beanName) {
        System.out.println("3.BeanNameAware beanName=" + beanName);
    }


    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("4.BeanFactory " + beanFactory.toString());
    }

    @Override
    public void setApplicationContext(ApplicationContext ac) throws BeansException {
        System.out.println("5.ApplicationContextAware " + ac.getBean("bean").toString());
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("7.afterPropertiesSet");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("11.DisposableBean ");
    }
}
